/**
 * ===================================
 * 子弹游戏对象 (Bullet.js)
 * ===================================
 * 
 * 功能说明：
 * - 管理子弹的发射、移动、碰撞和销毁
 * - 继承自GameObjects.Image，具备基本的图像显示功能
 * - 支持方向性射击（可指定目标点）
 * - 包含视觉特效（发光效果、爆炸粒子）
 * - 自动边界检测和内存管理
 * 
 * 使用场景：
 * - 玩家子弹：直线射击或指向性射击
 * - 敌人子弹：朝向玩家的追踪射击
 * - 通过对象池管理，避免频繁创建销毁
 * 
 * 作者：游戏开发团队
 * 创建时间：2024年
 */

// 导入Phaser3核心模块
import { GameObjects, Math } from "phaser";

/**
 * 子弹类 - 继承自GameObjects.Image
 * 基础图像对象，不具备物理属性，通过手动计算实现移动
 */
export class Bullet extends GameObjects.Image
{
    // ===== 移动属性 =====
    speed;                              // 子弹移动速度（像素/秒）
    
    // ===== 视觉效果 =====
    flame;                              // 爆炸火焰粒子效果对象
    
    // ===== 方向控制 =====
    end_direction = new Math.Vector2(0, 0);  // 子弹移动方向向量（已标准化）

    /**
     * 构造函数 - 初始化子弹对象
     * @param {Phaser.Scene} scene - 当前场景实例
     * @param {number} x - 初始X坐标
     * @param {number} y - 初始Y坐标
     */
    constructor(scene, x, y) {
        // 调用父类构造函数，创建图像对象
        // 参数：场景, X坐标, Y坐标, 默认纹理ID("bullet")
        super(scene, x, y, "bullet");
        
        // ===== 设置移动速度 =====
        // Phaser.Math.GetSpeed(450, 1) 计算每毫秒移动的像素数
        // 450像素/秒 = 0.45像素/毫秒
        this.speed = Phaser.Math.GetSpeed(450, 1);
        
        // ===== 添加发光特效 =====
        // 为子弹添加白色发光效果，增强视觉冲击力
        this.postFX.addBloom(
            0xffffff,   // 发光颜色：白色
            1,          // 发光强度
            1,          // 发光质量
            2,          // 发光半径
            1.2         // 发光亮度
        );
        
        // ===== 设置默认标识 =====
        // 用于区分玩家子弹和敌人子弹
        this.name = "bullet";
    }

    /**
     * ===== 发射子弹方法 =====
     * 激活子弹并设置发射参数
     * @param {number} x - 发射起始X坐标
     * @param {number} y - 发射起始Y坐标
     * @param {number} targetX - 目标X坐标（默认1表示直线射击）
     * @param {number} targetY - 目标Y坐标（默认0表示直线射击）
     * @param {string} bullet_texture - 子弹纹理ID（默认"bullet"）
     */
    fire (x, y, targetX = 1, targetY = 0, bullet_texture = "bullet")
    {
        // ===== 设置子弹外观 =====
        // 根据子弹类型切换纹理（玩家子弹 vs 敌人子弹）
        this.setTexture(bullet_texture);

        // ===== 设置子弹位置和状态 =====
        this.setPosition(x, y);         // 设置发射起始位置
        this.setActive(true);           // 激活子弹（对象池管理）
        this.setVisible(true);          // 显示子弹

        // ===== 计算移动方向 =====
        if (targetX === 1 && targetY === 0) {
            // 默认参数：直线向右射击
            this.end_direction.setTo(1, 0);
        } else {
            // 指定目标：计算从起始点到目标点的方向向量
            this.end_direction.setTo(
                targetX - x,    // X方向分量
                targetY - y     // Y方向分量
            ).normalize();      // 标准化向量（长度为1）
        }
    }

    /**
     * ===== 销毁子弹方法 =====
     * 播放爆炸特效并销毁子弹对象
     */
    destroyBullet ()
    {
        // ===== 创建爆炸粒子特效 =====
        if (this.flame === undefined) {
            // 在子弹位置创建火花粒子系统
            this.flame = this.scene.add.particles(
                this.x,         // 粒子发射X坐标
                this.y,         // 粒子发射Y坐标
                'flares',       // 粒子纹理ID
                {
                    // ===== 粒子系统配置 =====
                    lifespan: 250,                              // 粒子生命周期：250毫秒
                    scale: { start: 1.5, end: 0, ease: 'sine.out' }, // 缩放：从1.5缩小到0
                    speed: 200,                                 // 粒子初始速度：200像素/秒
                    advance: 500,                               // 粒子系统预运行时间
                    frequency: 20,                              // 发射频率：每20毫秒发射一次
                    blendMode: 'ADD',                           // 混合模式：加法混合（发光效果）
                    duration: 100,                              // 发射持续时间：100毫秒
                }
            );
            
            // ===== 设置粒子层级 =====
            this.flame.setDepth(1);  // 确保粒子显示在其他对象之上
            
            // ===== 粒子完成后清理 =====
            this.flame.once("complete", () => {
                this.flame.destroy();  // 粒子动画完成后销毁粒子系统
            });
        }

        // ===== 销毁子弹对象 =====
        this.setActive(false);      // 停用子弹（对象池回收）
        this.setVisible(false);     // 隐藏子弹
        this.destroy();             // 销毁子弹对象（释放内存）
    }

    /**
     * ===== 更新方法 =====
     * 每帧调用，处理子弹移动和边界检测
     * @param {number} time - 游戏运行总时间（毫秒）
     * @param {number} delta - 距离上一帧的时间间隔（毫秒）
     */
    update (time, delta)
    {
        // ===== 更新子弹位置 =====
        // 基于方向向量和速度计算新位置
        // delta确保移动速度不受帧率影响
        this.x += this.end_direction.x * this.speed * delta;
        this.y += this.end_direction.y * this.speed * delta;

        // ===== 边界检测 =====
        // 检查子弹是否飞出屏幕边界，如果是则自动销毁
        const canvas = this.scene.sys.canvas;
        if (this.x > canvas.width ||    // 超出右边界
            this.x < 0 ||               // 超出左边界
            this.y > canvas.height ||   // 超出下边界
            this.y < 0) {               // 超出上边界
            
            // ===== 边界外销毁 =====
            this.setActive(false);      // 停用子弹
            this.setVisible(false);     // 隐藏子弹
            this.destroy();             // 销毁对象，释放内存
        }
    }
}